/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.intesal.proyecto.controlador;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import sv.com.intesal.clases.abstracts.ControladorAbstract;
import sv.com.intesal.proyecto.bean.Cliente;
import sv.com.intesal.proyecto.sql.SQLCliente;

/**
 *
 * @author ejerez
 */
public class ClienteControlador extends ControladorAbstract {

    private class Filtro {

        public String getFiltro_TipoCliente(Cliente c) {
            try {
                String var_filtro = "";

                if (c.getEstado_filtro_tc() == true) {
                    var_filtro = " and tc.codigo_tc=" + c.getCodigo_tc() + " ";
                }
                return var_filtro;
            } catch (Exception e) {
                return "";
            }
        }

        public String getFiltro_Pais(Cliente c) {
            try {
                String var_filtro = "";

                if (c.getEstado_filtro_p() == true) {
                    var_filtro = " and p.codigo_p=" + c.getCodigo_p() + " ";
                }
                return var_filtro;
            } catch (Exception e) {
                return "";
            }
        }

        public String getFiltro_Departamento(Cliente c) {
            try {
                String var_filtro = "";

                if (c.getEstado_filtro_d() == true) {
                    var_filtro = " and d.codigo_d=" + c.getCodigo_d() + " ";
                }
                return var_filtro;
            } catch (Exception e) {
                return "";
            }
        }

        public String getFiltro_Municipio(Cliente c) {
            try {
                String var_filtro = "";

                if (c.getEstado_filtro_m() == true) {
                    var_filtro = " and m.codigo_m=" + c.getCodigo_m() + " ";
                }
                return var_filtro;
            } catch (Exception e) {
                return "";
            }
        }

        public String getFiltro_Estado(Boolean var_boolean) {
            try {
                String var_filtro = "";

                if (var_boolean == true) {
                    var_filtro = " and c.estado_c='A' ";
                }
                return var_filtro;
            } catch (Exception e) {
                return "";
            }
        }
    }

    public void insert(Cliente c) throws Exception {
        try {
            super.setPreparedStatement(SQLCliente.insert);
            super.ps.setInt(1, c.getCodigo_m());
            super.ps.setInt(2, c.getCodigo_tc());
            super.ps.setString(3, c.getEmpresa_c());
            super.ps.setString(4, c.getContacto_c());
            super.ps.setString(5, c.getDireccion_c());
            super.ps.setString(6, c.getOtra_informacion_c());
            super.ps.setString(7, c.getTelefono_c());
            super.ps.setString(8, c.getRegistro_c());
            super.ps.setString(9, c.getNit_c());
            super.ps.setString(10, c.getGiro_c());
            super.ps.setDouble(11, c.getLimite_credito_c());
            super.ps.setString(12, c.getEmail_c());
            super.ps.setInt(13, c.getPlazo_c());
            super.ps.setString(14, super.v.getEstado(c.getAplicar_retencion_filtro_c()));
            super.ps.setString(15, super.v.getEstado(c.getEstado_filtro_c()));
            super.ps.executeUpdate();
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
            super.setCloseConexion();
        }
    }

    public void update(Cliente c) throws Exception {
        try {
            super.setPreparedStatement(SQLCliente.update);
            super.ps.setInt(1, c.getCodigo_m());
            super.ps.setInt(2, c.getCodigo_tc());
            super.ps.setString(3, c.getEmpresa_c());
            super.ps.setString(4, c.getContacto_c());
            super.ps.setString(5, c.getDireccion_c());
            super.ps.setString(6, c.getOtra_informacion_c());
            super.ps.setString(7, c.getTelefono_c());
            super.ps.setString(8, c.getRegistro_c());
            super.ps.setString(9, c.getNit_c());
            super.ps.setString(10, c.getGiro_c());
            super.ps.setDouble(11, c.getLimite_credito_c());
            super.ps.setString(12, c.getEmail_c());
            super.ps.setInt(13, c.getPlazo_c());
            super.ps.setString(14, super.v.getEstado(c.getAplicar_retencion_filtro_c()));
            super.ps.setString(15, super.v.getEstado(c.getEstado_filtro_c()));
            super.ps.setInt(16, c.getCodigo_c());
            super.ps.executeUpdate();
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
            super.setCloseConexion();
        }
    }

    public List<Cliente> getClientes() throws Exception {
        List<Cliente> lista = new ArrayList<Cliente>();
        try {
            this.getExecuteQuery(SQLCliente.getClientes);
            while (super.rs.next()) {
                lista.add(this.getCliente(super.rs));
            }
            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
            super.setCloseConexion();
        }
    }   

    private Cliente getCliente(ResultSet rs) throws Exception {
        try {
            Cliente c = new Cliente();
            c.setCodigo_c(rs.getInt("codigo_c"));
            c.setEmpresa_c(rs.getString("empresa_c"));
            c.setContacto_c(rs.getString("contacto_c"));
            c.setDireccion_c(rs.getString("direccion_c"));
            c.setOtra_informacion_c(rs.getString("otra_informacion_c"));
            c.setTelefono_c(rs.getString("telefono_c"));
            c.setRegistro_c(rs.getString("registro_c"));
            c.setNit_c(rs.getString("nit_c"));
            c.setGiro_c(rs.getString("giro_c"));
            c.setLimite_credito_c(rs.getDouble("limite_credito_c"));
            c.setEmail_c(rs.getString("email_c"));
            c.setPlazo_c(rs.getInt("plazo_c"));

            c.setAplicar_retencion_c(rs.getString("aplicar_retencion_c"));
            c.setAplicar_retencion_filtro_c(v.getEstado(rs.getString("aplicar_retencion_c")));

            c.setEstado_c(rs.getString("estado_c"));
            c.setEstado_filtro_c(v.getEstado(rs.getString("estado_c")));

            /*TIPO_Cliente*/
            c.setCodigo_tc(rs.getInt("codigo_tc"));
            c.setNombre_tc(rs.getString("nombre_tc"));

            /*PAIS*/
            c.setCodigo_p(rs.getInt("codigo_p"));
            c.setCodigo_p2(rs.getInt("codigo_p"));
            c.setNombre_p(rs.getString("nombre_p"));

            /*DEPARTAMENTO*/
            c.setCodigo_d(rs.getInt("codigo_d"));
            c.setCodigo_d2(rs.getInt("codigo_d"));
            c.setNombre_d(rs.getString("nombre_d"));

            /*MUNICIPIO*/
            c.setCodigo_m(rs.getInt("codigo_m"));
            c.setCodigo_m2(rs.getInt("codigo_m"));
            c.setNombre_m(rs.getString("nombre_m"));

            return c;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<Cliente> getConsultaClientesActivos(Cliente c) throws Exception {
        List<Cliente> lista = new ArrayList<Cliente>();
        Filtro f = new Filtro();

        try {

            String sql = SQLCliente.Consulta.getClientes;
            sql += f.getFiltro_Pais(c) + f.getFiltro_Departamento(c) + f.getFiltro_Municipio(c) + f.getFiltro_TipoCliente(c) + f.getFiltro_Estado(Boolean.TRUE);
            sql += SQLCliente.Consulta.getClientesOrderBy;

            System.out.println(sql);
            this.getExecuteQuery(sql);
            while (super.rs.next()) {
                lista.add(this.getCliente(super.rs));
            }

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
            super.setCloseConexion();
        }
    }
}
